package com.bearsadmin.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * JWT工具类
 *
 * @author Bears Admin
 * @since 1.0.0
 */
public class JwtUtil {

    /**
     * JWT密钥
     */
    private static final String SECRET = "bearsadmin2024!@#$%^&*()";

    /**
     * JWT过期时间（7天）
     */
    private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000;

    /**
     * 生成JWT token
     *
     * @param userId   用户ID
     * @param username 用户名
     * @return JWT token
     */
    public static String generateToken(Long userId, String username) {
        Map<String, Object> payload = new HashMap<>();
        payload.put("userId", userId);
        payload.put("username", username);
        payload.put(JWTPayload.ISSUED_AT, System.currentTimeMillis());
        payload.put(JWTPayload.EXPIRES_AT, System.currentTimeMillis() + EXPIRE_TIME);

        return JWTUtil.createToken(payload, SECRET.getBytes());
    }

    /**
     * 验证JWT token
     *
     * @param token JWT token
     * @return 验证结果
     */
    public static boolean verifyToken(String token) {
        try {
            return JWTUtil.verify(token, SECRET.getBytes());
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 解析JWT token
     *
     * @param token JWT token
     * @return JWT对象
     */
    public static JWT parseToken(String token) {
        return JWTUtil.parseToken(token);
    }

    /**
     * 从token中获取用户ID
     *
     * @param token JWT token
     * @return 用户ID
     */
    public static Long getUserId(String token) {
        JWT jwt = parseToken(token);
        return jwt.getPayload("userId").toString() != null ? Long.valueOf(jwt.getPayload("userId").toString()) : null;
    }

    /**
     * 从token中获取用户名
     *
     * @param token JWT token
     * @return 用户名
     */
    public static String getUsername(String token) {
        JWT jwt = parseToken(token);
        return jwt.getPayload("username").toString();
    }
}